package com.hedl.practice.diyJava.io.study_outputstream.test;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * Java标准库的java.io.OutputStream定义了所有输出流的超类：
 *      FileOutputStream实现了文件流输出；
 *      ByteArrayOutputStream在内存中模拟一个字节流输出。
 *某些情况下需要手动调用OutputStream的flush()方法来强制输出缓冲区。
 *总是使用try(resource)来保证OutputStream正确关闭。
 */
public class Main {
    public static void main(String[] args) throws IOException {
        //FileOutputStream为例，演示如何将若干个字节写入文件流：
        OutputStream output = new FileOutputStream("/Users/a101/idea/like.txt");        //往文件中写入数据
        /*output.write(72);   //H
        output.write(101); // e
        output.write(108); // l
        output.write(108); // l
        output.write(111); // o
        output.close();*/

        /**
         * 每次写入一个字节非常麻烦，更常见的方法是一次性写入若干字节。
         * 这时，可以用OutputStream提供的重载方法void write(byte[])来实现：
         */
        /*output.write("Hello！".getBytes("UTF-8"));           //write(字符串,字符类型)
        output.close();*/

        /**
         * 上述代码没有考虑到在发生异常的情况下如何正确地关闭资源；
         * 写入过程也会经常发生IO错误，
         * 例如，磁盘已满，无权限写入等等。
         * 我们需要用try(resource)来保证OutputStream在无论是否发生IO错误的时候都能够正确地关闭：
         */
        try(OutputStream outputStream = new FileOutputStream("/Users/a101/idea/like.txt")){
            outputStream.write("Hello,World!".getBytes("UTF-8"));
        }// 编译器在此自动为我们写入finally并调用close(),这里和input一样编译器会自动给我们close

        System.out.println("======================================OutputStream实现类==================================");

        /**
         * 用FileOutputStream可以从文件获取输出流，这是OutputStream常用的一个实现类。
         * 此外，ByteArrayOutputStream可以在内存中模拟一个OutputStream：
         */
        byte[] data;
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){
            byteArrayOutputStream.write("Hello".getBytes("UTF-8"));
            byteArrayOutputStream.write("world".getBytes("UTF-8"));
            data = byteArrayOutputStream.toByteArray();
        }
        System.out.println(new String(data,"UTF-8"));
        //同时操作多个AutoCloseable资源时，在try(resource) { ... }语句中可以同时写出多个资源，用;隔开。例如，同时读写两个文件：
    }
}
